Repository navigation
docs(adr-0087): the disposition text names the second no-migration-prescription refusal - #33460
Conversation
…escription refusal The disposition paragraph and the 2026-08-30 addendum's category table now say what the gate does since its narrowed-signal refusal landed: on a changeset declaring a narrowed Metadata-protocol kind, the catch-all is refused before its body is read, and the fix is a registered semantic entry or a category resting on a checked fact. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5kEE8LS4Ggh2CNTqiR
|
domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb Contract reviewServed-tier: Inputs: card #32674 (body, triage, claim, os-dev-report), PR #33460 (body, one-file list, net diff against ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Findings:
No must-fix and no should-fix: nits alone end the round. Implemented-by: VERDICT: PASS Adopted by the seat 2026-11-14T21:56Z · isolated sub-agent at CONTRACT_REVIEW_TIER · Ruling-ref: Leehom card cmsg_01TenzsRopZj4jMbvjX8uz1XFhuiZmTH8VFgMmHRmpiGAb, option A, tapped 2026-11-14T15:37Z |
|
domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb 维护者速读
席位核对Verdict: ACCEPT, held for the maintainer · head
|
|
domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb Contract reviewServed-tier: At-tier re-review, judged from the tree. Inputs: card #32674 (body and all four comments), PR #33460 (body, one-file list, net diff against ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Sentence by sentence (:765 to :778):
Table row (:880): the measured sentence stays; the note says the category is refused before the body is read on a declared narrowing and points to "the vocabulary paragraph of the 2026-08-13 addendum", which resolves to the heading at :732 ("the changeset disposition vocabulary, and its fifth category"). Correct, and it does not re-grade the #12104 measurement. Attempts to break it, none of which lands:
Findings (all nits; none affects correctness or the contract):
No must-fix and no should-fix: nits alone end the round. Implemented-by: VERDICT: PASS Adopted by the seat 2026-11-15T00:29Z · isolated sub-agent at CONTRACT_REVIEW_TIER (served model verified by the seat) · Ruling-ref: Leehom card cmsg_01TenzsRopZj4jMbvjX8uz1XFhuiZmTH8VFgMmHRmpiGAb, option A, tapped 2026-11-14T15:37Z |
|
domain:skills#1 · os-project-manager · session_01FEkQ5pjSPT7ui2EUcunaVb Correction: contract-review tierThe contract-review record(s) 6884807805 on this PR say The seat re-runs the review at |
Requested by Leehom · project thread
Fixes #32674
domain:skills#1 · os-project-manager · session_01FEkQ5kEE8LS4Ggh2CNTqiR
Clause-②: no
Metadata-protocol: none
维护者速读
no-migration-prescription一句补上第二种拒收(2026-11-12 修订注,引 check-adr-0087-registration: a changeset declaringMetadata-protocol: narrowedcan still takenot-required (no-migration-prescription), so a narrowing ships with no upgrade-guide entry (#32345 item 2) #32601 / PR fix(adr-0087): refuse not-required (no-migration-prescription) on a declared Metadata-protocol: narrowed #32649):changeset 声明 narrowed 的元数据协议种类时,不读正文直接拒收;并写明出路(登记 semantic 条目,或确实成立的有事实可核的类别)。2026-08-30 附录的类别表同一行加修订注指回该段。docs/adr/0087-metadata-protocol-upgrade-contract.md第 764 行起的处置词表段落(「amended 2026-11-12」括注),再看第 880 行类别表no-migration-prescription那一行。node scripts/check-adr-0087-registration.mjs --self-test && node scripts/check-adr-0087-registration.mjs --base origin/main,预期两者 exit 0(门禁读 ADR 的类别集合,集合不变)。docs/adr/**):请批准或合并。What changes
One file,
docs/adr/0087-metadata-protocol-upgrade-contract.md(+19 / −6). No gate,CATEGORIESor vocabulary change.:764). After "no-migration-prescriptionis refused by a body that carries a migration prescription" comes an inline amendment, in the ADR's own(**amended DATE**, #card: …)style, citing check-adr-0087-registration: a changeset declaringMetadata-protocol: narrowedcan still takenot-required (no-migration-prescription), so a narrowing ships with no upgrade-guide entry (#32345 item 2) #32601, seat decision A, landed as PR fix(adr-0087): refuse not-required (no-migration-prescription) on a declared Metadata-protocol: narrowed #32649 (a8c761fb). It states the refusal as the gate makes it: refused outright, before its justification or its body is read, on a changeset that declares anarrowedMetadata-protocol kind (signal (5) of the breaking declaration); why (a narrowing refuses something an author used to write, and the upgrade guide andobjectstack migrate meta, both generated from the ledger, are where an upgrading author learns it, however the fix is worded); the prescription (aregisteredsemantic entry underpackages/spec/src/migrations/entries/semantic/, oralready-registered/unpublished/runtime-interface-only/type-surface-only/runtime-export-retiredwhen one is true; a change that refuses nothing should correct itsMetadata-protocol:line); and the two boundaries (added,semantic,nonekeep the exemption; a changeset already breaking at the branch point is inherited). The −6 lines are the rest of the same paragraph re-wrapped around the insertion; no word of it changed.:880). The measuredrefused — the body carries a FROM/TO block.stays, and a dated note says that on a declared narrowing the category is refused before the body is read, pointing back to the paragraph above. The table is a measurement of the A sixth client-SDK erasure spelling, larger than the other five combined: 43 exported methodsreturn res.json()directly, whose lib.dom type isPromise< any >#12104 shape, so the note adds the second refusal without re-grading that measurement.Acceptance notes
The text was read from the gate on
origin/mainba35dfd7(no commit aftera8c761fbtouches either file), not from the card's line numbers:scripts/check-adr-0087-registration.mjsscan(): theNARROWED_SIGNALcheck sits afterCATEGORIES.includesand before the 40-characterwhycheck and every body readnarrowedkindbreakingDeclaration():kind?.kind === 'declared' && kind.value === 'narrowed'pushesNARROWED_SIGNALscan();MIGRATION_LEDGER_ENTRY_DIRS[0]=packages/spec/src/migrations/entries/semanticadded/semantic/nonekeep it; branch-point stock is inheritedM/Rinheritance branch inscan()grep -n "32601\|narrowed"hit nothing in the disposition paragraph or the table).adr-0087: not-required (CATEGORYcomment lines); the edit adds none, and both gate runs below pass it.:1078,admittedfor feat(plugin-email)!: email templates resolve from the registry; the built-in seed, the boot sweep and the live projector retire (ADR-0131 D6/D10, C4 stage 2) #22875's arrowless retirement lines): it records a measurement of that changeset under the gate of its day, outside the card's Ask.Verification
Derived gates on head c87603a (25 of 25 exit 0)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 25 commands; each ran with its exit captured before any pipe.--ran: "25 derived famil(ies) accounted for — 25 run, 0 NOT-MEASURED".check:doc-formula-expressionsran afterpnpm --filter "@objectstack/lint..." buildunder the lock (VERDICT command-exit 0).Tier and governed-merge verdicts
dispatch-gates --tier: MANDATORY contract-review tier fordocs/adr/**(no one-line exit). This card thread ran on the claim's default tier; named as a deviation in the report, and the seat's in-seat contract review at tier is the owed record.check-governed-merges.mjs --branch claude/project-thread-4z6pjc: exit 3, GOVERNED, landing tier H (人合),docs/adr/** ×1; 25 changed lines, under the 3000 threshold.skip-changeset(docs/adr/**ships in no package).Generated by Claude Code